/************************************************************
 * Project Name         [Thinking_In_Java]
 * File Name            [Note.java]
 * Creation Date        [01-Jul-2014]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ************************************************************/
package pkg_06_collections;

/**
 * 
 * @author 不落的太阳(Sean Yang)
 * @version 1.0
 * @since JDK 6
 * 
 */
public class Note {

	/**
	 * (1) ArrayList<br>
	 * ArrayList是最常用的List实现类, 内部是通过数组实现的, 它允许对元素进行快速随机访问.<br>
	 * 数组的缺点是每个元素之间不能含有空隙"<br>
	 * 当ArrayList大小不满足时会增加存储能力(新长度为原长度的1.5倍+1), 将已有数组数据复制到新的存储空间中<br>
	 * 当从ArrayList的中间位置插入或者删除元素时, 需要对数组进行拷贝, 移动, 代价比较高<br>
	 * 因此, 它适合随机查找和遍历, 不适合插入和删除<br>
	 * 
	 * (2)Vector<br>
	 * Vector与ArrayList一样, 也是通过数组实现的<br>
	 * 不同的是它支持线程的同步, 即一时刻只有一个线程能够写Vector, 避免多线程同时写引起的不一致性<br>
	 * 但实现同步需要很高的花费, 因此, 访问它比访问ArrayList慢<br>
	 * 
	 * (3)LinkedList<br>
	 * LinkedList使用链表结构存储数据, 很适合数据的动态插入和删除, 随机访问和遍历速度比较慢<br>
	 * 另外, 它还提供了List没有定义的方法, 专门用于操作表头和表尾元素, 可以当作堆栈, 队列和双向队列使用<br>
	 * 
	 * (4)ArrayList和Vector都是用数组实现的, 所以在添加和插入时, 最好从表尾操作, 而不要从中间或者表头开始,
	 * 以避免数组移动引起的开销!<br>
	 * 
	 * (5)可以为每个List生成ListIterator, 支持双向遍历List, 而且能够在ListIterator位置插入和删除元素<br>
	 * 
	 * (6)堆栈类继承Vector, 它总是对列表的尾部数据进行操作, 采用了先进后出的策略, 自定义了插入, 查看和弹出元素三个方法<br>
	 * 
	 */

	/**
	 * (1)Set不允许重复元素, 因此加入Set的Object必须定义equals()方法以确保对象的唯一性<br>
	 * 
	 * (2)HashSet采用散列函数对元素进行排序, 是专门为快速查询而设计的. 存入HashSet的对象必须定义hashCode()<br>
	 * HashSet底层是使用HashMap实现的<br>
	 * 当使用add方法将对象添加到Set当中时, 实际上是将该对象作为底层所维护的Map对象的key,而value则都是同一个Object对象<br>
	 * 
	 * (3)TreeSet采用红黑树的数据结构进行排序元素, 能保证元素的次序, 使用它可以从Set中提取有序的序列<br>
	 * 需要注意的是, 生成自己的类时,Set需要维护元素的存储顺序, 因此要实现Comparable接口并定义compareTo()方法<br>
	 * 
	 * (4)LinkedHashSet内部使用散列以加快查询速度, 同时使用链表维护元素的插入的次序, 在使用迭代器遍历Set时,
	 * 结果会按元素插入的次序显示<br>
	 * 
	 */

	/**
	 * Map用于存储键值对, 不允许键重复, 值可以重复, 如果插入两个键值一样的记录, 那么后插入的记录会覆盖先插入的记录
	 * 
	 * (1)HashMap<br>
	 * HashMap是一个最常用的Map, 它根据键的hashCode值存储数据, 根据键可以直接获取它的值, 具有很快的访问速度<br>
	 * HashMap底层维护一个数组, 向HashMap中所放置的对象实际上是存储在该数组当中<br>
	 * HashMap最多只允许一条记录的键为null, 允许多条记录的值为null<br>
	 * HashMap不支持线程的同步, 即任一时刻可以有多个线程同时写HashMap, 可能会导致数据的不一致<br>
	 * 如果需要同步, 可以用Collections.synchronizedMap(HashMap map)方法使HashMap具有同步的能力<br>
	 * 
	 * 当向HashMap中put一对键值时, 它会根据key的hashCode值计算出一个位置, 该位置就是此对象准备往数组中存放的位置<br>
	 * 如果该位置没有对象存在, 就将此对象直接放进数组当中; 如果该位置已经有对象存在了, 则顺着此存在的对象的链开始寻找<br>
	 * [Entry类有一个Entry类型的next成员变量, 指向了该对象的下一个对象]<br>
	 * 如果此链上有对象的话, 再去使用equals方法进行比较<br>
	 * 如果对此链上的某个对象的equals方法比较为false, 则将该对象放到数组当中, 然后将数组中该位置以前存在的那个对象链接到此对象的后面<br>
	 * 
	 * (2)Hashtable<br>
	 * 与HashMap类似, 不同的是: 它不允许记录的键或者值为空; 它支持线程的同步<br>
	 * 即任一时刻只有一个线程能写Hashtable, 然而, 这也导致了Hashtable在写入时会比较慢<br>
	 * 
	 * (3)LinkedHashMap保存了记录的插入顺序, 在用Iterator遍历LinkedHashMap时, 先得到的记录肯定是先插入的,
	 * 在遍历的时候会比HashMap慢, 其键和值均可以为null
	 * 
	 * (4)TreeMap能够把它保存的记录根据键排序, 默认是按升序排序, 也可以指定排序的比较器; 当用Iterator遍历TreeMap时,
	 * 得到的记录是排过序的, 其键值或均不可以为null
	 * 
	 */

}
